package cl.tinet.trainee.proyecto.ejb;

import java.util.ArrayList;

import javax.ejb.Remote;

import cl.tinet.trainee.proyecto.excepciones.ObjetoDuplicadoException;
import cl.tinet.trainee.proyecto.excepciones.ObjetoNoEncontradoException;

/**
 * 
 * Interfaz que define los metodos a implementar por las clases bean.
 * 
 * @author Jose Palma
 * @param <T>
 */
@Remote
public interface InterfazBeanGenerico<T> {
    /**
     * 
     * Recibe un elemento desde el MB, verifica a traves del dao si existe. Si
     * existe lanza una excepcion de elemento duplicado y si no existe lo
     * envia al dao para ser almacenado.
     * 
     * @param nuevoObjeto
     *            Objeto que se desea almacenar.
     * @throws ObjetoDuplicadoException
     *             Se genera cuando el nuevoObjeto ya existe en la BD.
     */
    void agregar(T nuevoObjeto) throws ObjetoDuplicadoException;

    /**
     * 
     * Busca un objeto en la BD. Si existe lo retorna y sino retorna un null.
     * 
     * @param objetoABuscar
     *            Objeto a enviar al Dao para ser buscado.
     * @return El objeto encontrado por el Dao o null si no existe.
     * @throws ObjetoNoEncontradoException
     *             Se genera cuando no existe el objeto en la BD.
     */
    T buscar(T objetoABuscar) throws ObjetoNoEncontradoException;

    /**
     * 
     * Recibe un objeto desde el MB, verifica a traves del dao si existe y si
     * existe lo elimina.
     * 
     * @param objetoAEliminar
     *            Objeto a eliminar.
     * 
     * @throws ObjetoNoEncontradoException
     *             Se genera cuando no existe el objeto en la BD.
     */
    void borrar(T objetoAEliminar) throws ObjetoNoEncontradoException;

    /**
     * 
     * Recibe un elemento desde el MB con datos actualizados, invoca al metodo
     * buscar. Si lo encuentra, copia los datos al elemento encontrado y lo
     * envia al dao para ser almacenado.
     * 
     * @param objetoAActualizar
     *            Objeto con los datos actualizados.
         * @throws ObjetoNoEncontradoException
     *             Se genera cuando no existe el objeto en la BD.
     */
    void actualizar(T objetoAActualizar) throws ObjetoNoEncontradoException;

    /**
     * 
     * Busca todos los elementos existentes de la tabla a traves del dao y los
     * retorna.
     * 
     * @return la lista de objetos encontrados o null si esta vacia.
     */
    ArrayList<T> listar();

}
